//! @todo this could be initialised using a json property file

// register the element numbers, names and symbols
const std::map< ElementID::Number, ElementID::Entry >
ElementID::element_dictionary{

  { 1, ElementID::Entry{ 1, "H", "Hydrogen" } },
  { 2, ElementID::Entry{ 2, "He", "Helium" } },
  { 3, ElementID::Entry{ 3, "Li", "Lithium" } },
  { 4, ElementID::Entry{ 4, "Be", "Beryllium" } },
  { 5, ElementID::Entry{ 5, "B", "Boron" } },
  { 6, ElementID::Entry{ 6, "C", "Carbon" } },
  { 7, ElementID::Entry{ 7, "N", "Nitrogen" } },
  { 8, ElementID::Entry{ 8, "O", "Oxygen" } },
  { 9, ElementID::Entry{ 9, "F", "Fluorine" } },
  { 10, ElementID::Entry{ 10, "Ne", "Neon" } },
  { 11, ElementID::Entry{ 11, "Na", "Sodium" } },
  { 12, ElementID::Entry{ 12, "Mg", "Magnesium" } },
  { 13, ElementID::Entry{ 13, "Al", "Aluminium", { "Aluminum" } } },
  { 14, ElementID::Entry{ 14, "Si", "Silicon" } },
  { 15, ElementID::Entry{ 15, "P", "Phosphorus" } },
  { 16, ElementID::Entry{ 16, "S", "Sulfur" } },
  { 17, ElementID::Entry{ 17, "Cl", "Chlorine" } },
  { 18, ElementID::Entry{ 18, "Ar", "Argon" } },
  { 19, ElementID::Entry{ 19, "K", "Potassium" } },
  { 20, ElementID::Entry{ 20, "Ca", "Calcium" } },
  { 21, ElementID::Entry{ 21, "Sc", "Scandium" } },
  { 22, ElementID::Entry{ 22, "Ti", "Titanium" } },
  { 23, ElementID::Entry{ 23, "V", "Vanadium" } },
  { 24, ElementID::Entry{ 24, "Cr", "Chromium" } },
  { 25, ElementID::Entry{ 25, "Mn", "Manganese" } },
  { 26, ElementID::Entry{ 26, "Fe", "Iron" } },
  { 27, ElementID::Entry{ 27, "Co", "Cobalt" } },
  { 28, ElementID::Entry{ 28, "Ni", "Nickel" } },
  { 29, ElementID::Entry{ 29, "Cu", "Copper" } },
  { 30, ElementID::Entry{ 30, "Zn", "Zinc" } },
  { 31, ElementID::Entry{ 31, "Ga", "Gallium" } },
  { 32, ElementID::Entry{ 32, "Ge", "Germanium" } },
  { 33, ElementID::Entry{ 33, "As", "Arsenic" } },
  { 34, ElementID::Entry{ 34, "Se", "Selenium" } },
  { 35, ElementID::Entry{ 35, "Br", "Bromine" } },
  { 36, ElementID::Entry{ 36, "Kr", "Krypton" } },
  { 37, ElementID::Entry{ 37, "Rb", "Rubidium" } },
  { 38, ElementID::Entry{ 38, "Sr", "Strontium" } },
  { 39, ElementID::Entry{ 39, "Y", "Yttrium" } },
  { 40, ElementID::Entry{ 40, "Zr", "Zirconium" } },
  { 41, ElementID::Entry{ 41, "Nb", "Niobium" } },
  { 42, ElementID::Entry{ 42, "Mo", "Molybdenum" } },
  { 43, ElementID::Entry{ 43, "Tc", "Technetium" } },
  { 44, ElementID::Entry{ 44, "Ru", "Ruthenium" } },
  { 45, ElementID::Entry{ 45, "Rh", "Rhodium" } },
  { 46, ElementID::Entry{ 46, "Pd", "Palladium" } },
  { 47, ElementID::Entry{ 47, "Ag", "Silver" } },
  { 48, ElementID::Entry{ 48, "Cd", "Cadmium" } },
  { 49, ElementID::Entry{ 49, "In", "Indium" } },
  { 50, ElementID::Entry{ 50, "Sn", "Tin" } },
  { 51, ElementID::Entry{ 51, "Sb", "Antimony" } },
  { 52, ElementID::Entry{ 52, "Te", "Tellurium" } },
  { 53, ElementID::Entry{ 53, "I", "Iodine" } },
  { 54, ElementID::Entry{ 54, "Xe", "Xenon" } },
  { 55, ElementID::Entry{ 55, "Cs", "Caesium", { "Cesium"} } },
  { 56, ElementID::Entry{ 56, "Ba", "Barium" } },
  { 57, ElementID::Entry{ 57, "La", "Lanthanum" } },
  { 58, ElementID::Entry{ 58, "Ce", "Cerium" } },
  { 59, ElementID::Entry{ 59, "Pr", "Praseodymium" } },
  { 60, ElementID::Entry{ 60, "Nd", "Neodymium" } },
  { 61, ElementID::Entry{ 61, "Pm", "Promethium" } },
  { 62, ElementID::Entry{ 62, "Sm", "Samarium" } },
  { 63, ElementID::Entry{ 63, "Eu", "Europium" } },
  { 64, ElementID::Entry{ 64, "Gd", "Gadolinium" } },
  { 65, ElementID::Entry{ 65, "Tb", "Terbium" } },
  { 66, ElementID::Entry{ 66, "Dy", "Dysprosium" } },
  { 67, ElementID::Entry{ 67, "Ho", "Holmium" } },
  { 68, ElementID::Entry{ 68, "Er", "Erbium" } },
  { 69, ElementID::Entry{ 69, "Tm", "Thulium" } },
  { 70, ElementID::Entry{ 70, "Yb", "Ytterbium" } },
  { 71, ElementID::Entry{ 71, "Lu", "Lutetium" } },
  { 72, ElementID::Entry{ 72, "Hf", "Hafnium" } },
  { 73, ElementID::Entry{ 73, "Ta", "Tantalum" } },
  { 74, ElementID::Entry{ 74, "W", "Tungsten" } },
  { 75, ElementID::Entry{ 75, "Re", "Rhenium" } },
  { 76, ElementID::Entry{ 76, "Os", "Osmium" } },
  { 77, ElementID::Entry{ 77, "Ir", "Iridium" } },
  { 78, ElementID::Entry{ 78, "Pt", "Platinum" } },
  { 79, ElementID::Entry{ 79, "Au", "Gold" } },
  { 80, ElementID::Entry{ 80, "Hg", "Mercury" } },
  { 81, ElementID::Entry{ 81, "Tl", "Thallium" } },
  { 82, ElementID::Entry{ 82, "Pb", "Lead" } },
  { 83, ElementID::Entry{ 83, "Bi", "Bismuth" } },
  { 84, ElementID::Entry{ 84, "Po", "Polonium" } },
  { 85, ElementID::Entry{ 85, "At", "Astatine" } },
  { 86, ElementID::Entry{ 86, "Rn", "Radon" } },
  { 87, ElementID::Entry{ 87, "Fr", "Francium" } },
  { 88, ElementID::Entry{ 88, "Ra", "Radium" } },
  { 89, ElementID::Entry{ 89, "Ac", "Actinium" } },
  { 90, ElementID::Entry{ 90, "Th", "Thorium" } },
  { 91, ElementID::Entry{ 91, "Pa", "Protactinium" } },
  { 92, ElementID::Entry{ 92, "U", "Uranium" } },
  { 93, ElementID::Entry{ 93, "Np", "Neptunium" } },
  { 94, ElementID::Entry{ 94, "Pu", "Plutonium" } },
  { 95, ElementID::Entry{ 95, "Am", "Americium" } },
  { 96, ElementID::Entry{ 96, "Cm", "Curium" } },
  { 97, ElementID::Entry{ 97, "Bk", "Berkelium" } },
  { 98, ElementID::Entry{ 98, "Cf", "Californium" } },
  { 99, ElementID::Entry{ 99, "Es", "Einsteinium" } },
  { 100, ElementID::Entry{ 100, "Fm", "Fermium" } },
  { 101, ElementID::Entry{ 101, "Md", "Mendelevium" } },
  { 102, ElementID::Entry{ 102, "No", "Nobelium" } },
  { 103, ElementID::Entry{ 103, "Lr", "Lawrencium" } },
  { 104, ElementID::Entry{ 104, "Rf", "Rutherfordium" } },
  { 105, ElementID::Entry{ 105, "Db", "Dubnium" } },
  { 106, ElementID::Entry{ 106, "Sg", "Seaborgium" } },
  { 107, ElementID::Entry{ 107, "Bh", "Bohrium" } },
  { 108, ElementID::Entry{ 108, "Hs", "Hassium" } },
  { 109, ElementID::Entry{ 109, "Mt", "Meitnerium" } },
  { 110, ElementID::Entry{ 110, "Ds", "Darmstadtium" } },
  { 111, ElementID::Entry{ 111, "Rg", "Roentgenium" } },
  { 112, ElementID::Entry{ 112, "Cn", "Copernicium" } },
  { 113, ElementID::Entry{ 113, "Nh", "Nihonium" } },
  { 114, ElementID::Entry{ 114, "Fl", "Flerovium" } },
  { 115, ElementID::Entry{ 115, "Mc", "Moscovium" } },
  { 116, ElementID::Entry{ 116, "Lv", "Livermorium" } },
  { 117, ElementID::Entry{ 117, "Ts", "Tennessine" } },
  { 118, ElementID::Entry{ 118, "Og", "Oganesson" } }
};

// register the alternatives (stored in lower case)
const std::map< std::string, ElementID::Number >
ElementID::conversion_dictionary = [] ( const auto& dictionary ) {

  std::map< std::string, ElementID::Number > conversion;
  for ( const auto& [ number, entry ] : dictionary ) {

    conversion[ tolower( entry.symbol() ) ] = number;
    conversion[ tolower( entry.name() ) ] = number;
    for ( const auto& alternative : entry.alternatives() ) {

      conversion[ tolower( alternative ) ] = number;
    }
  }
  return conversion;
}( ElementID::element_dictionary );
